import { randomString } from 'pub-bbx-utils';
import { getRootWindowInitData } from '@src/util/window'
import { cloneDeep } from 'lodash'
/* form */
import { FormFieldMap } from '@src/mform/components'
/* util */
import { isFunction } from '@src/util/type'

const rootWindowInitData = getRootWindowInitData()
const tenantId = rootWindowInitData?.user?.tenantId || ''

/** 补全formType 为select时的所需字段 */
function fillPropForSelect(params) {
  const setting = params.setting || {};

  let options = [];
  let isMulti = false;
  const dependencies = setting.dependencies || {};

  return {
    options,
    isMulti,
    dependencies
  };
}

/**
 * 用于表单设计的字段类
 * 后端给出的字段数据需要调用 util.toFormField 转换成该格式
 *
 * @author dongls
 */
export default class FormField {
  /**
   * 默认构造函数
   * @param {object} params - 构造函数参数
   * @param {string} params.formType - 字段类型
   * @param {string} params.displayName - 字段名称
   */
  constructor(params = {}) {
    // 旧字段没有id字段，而是使用fieldId替代
    this.id = params.id || params.fieldId;
    // 前端生成fieldName
    this.fieldName = params.fieldName || `field${randomString(32)}`;
    // 字段类型
    this.formType = params.formType;
    this.displayName = params.displayName || '标题';
    // 是否必填   0 - 必填，1 - 非必填
    this.isNull = typeof params.isNull == 'number' ? params.isNull : 1;
    // 是否可以编辑 1:可以编辑，0不可编辑
    this.revisable = typeof params.revisable == 'number' ? params.revisable : 1;
    // 是否可以编辑 1:可以编辑，0不可编辑
    this.visible = typeof params.visible == 'number' ? params.visible : 1;
    
    // 是否允许搜索 0 - 不允许，1 - 允许
    this.isSearch = typeof params.isSearch == 'number' ? params.isSearch : 0;
    this.placeHolder = params.placeHolder || ''; // 提示信息
    this.defaultValue = params.defaultValue; // 默认值
    // 是否为系统字段 0 - 非系统字段，1 - 系统字段
    this.isSystem = typeof params.isSystem == 'number' ? params.isSystem : 0;
    // 工单专属字段： 是否在移动端显示 0 - 不显示，1 - 显示
    this.isAppShow = typeof params.isAppShow == 'number' ? params.isAppShow : 0;
    // 是否隐藏   1 - 隐藏，0 - 不隐藏
    this.isHidden = typeof params.isHidden == 'number' ? params.isHidden : 0;
    // 工单专属字段：是否是公用字段 1 - 是，0 - 否
    this.isCommon = typeof params.isCommon == 'number' ? params.isCommon : 0;
    // 公用字段: 1.设为公用字段设置 2.需判断是否是升级为公用字段而非拖拽进来的公共字段 而不能直接用isCommon
    this.isPublic = this.isCommon;
    // 是否是拖拽进来的公共字段 0 - 不是，1 - 是
    this.isDragCommon = typeof params.isDragCommon == 'number' ? params.isDragCommon : 0;
    // 是否曾经是公共字段 0 - 不是，1 - 是
    this.isOnceCommon = typeof params.isOnceCommon == 'number' ? params.isOnceCommon : 0;
    // 子表单字段
    this.subFormFieldList = params.subFormFieldList || [];
    // 是否是子表单字段 0 - 不是，1 - 是
    this.isChildForm = 0;
    
    // formType 为select时需要补全一下字段
    const { options, isMulti, dependencies } = fillPropForSelect(params);
    
    this.options = options; // 下拉菜单类型选项
    this.isMulti = isMulti; // 是否为多选
    this.dependencies = dependencies; // 逻辑显示项用
    
    this.setting = params.setting || {};
    
    const fieldConfig = FormFieldMap.get(this.formType)
    if (fieldConfig && isFunction(fieldConfig.unPackFunction)) {
      fieldConfig.unPackFunction(this)
    }
    
    // 辅助字段
    this.dragging = false; // 当前字段时候正在被拖拽
  }
  
  /** @deprecated 兼容旧有写法*/
  get _id() {
    return this.id || this.fieldName;
  }
  
  /** 从Filed构建为组件可接受的字段 */
  static fromField(field) {
    return new FormField(field);
  }
  
  /** 将字段转换成后端可接收的字段 */
  static toField(field, index, module, typeId, isClone = true) {
    let option = field;
    
    if (isClone) {
      option = cloneDeep(field)
    }
    
    option.id = field.id || null
    option.tenantId = tenantId
    option.fieldName = field.fieldName;
    option.formType = field.formType;
    option.displayName = field.displayName;
    option.typeId = field.typeId || typeId
    option.orderId = index
    option.modular = field.modular || module
    option.createTime = field.createTime || null
    option.updateTime = field.updateTime || null
    
    option.setting = field.setting
    
    return option
  }
}
